package 类的定义;

/**
 * 类的定义
 */
public class ClassDefine {
    /**
     * 成员（fields）的定义
     * [public|private|protected] [static] [final] 类型  成员名;
     * public 公共成员 不同包也可访问
     * private 私有成员  只能在本类访问
     * protected 保护成员  同包及子类可访问
     * 默认  同胞可访问
     * ***********************************************
     * static 静态成员   属于类的，该类的所有对象共享该成员
     *       static成员或方法直接通过类名访问
     *******************************************************
     * final成员 最终成员   其值不能被改变
     * final类  最终类  不能被继承
     * final方法 最终方法  该方法不被重写
     */

    public static void main(String[] args){
        StaticDemo sd1=new StaticDemo();
        StaticDemo sd2=new StaticDemo();
        sd1.a=10; sd2.a=20;
        StaticDemo.b=100;StaticDemo.b=200;
        System.out.println(sd1.a+"   "+sd1.b);
        System.out.println(sd2.a+"   "+sd2.b);
        // 调用阶乘
        // 没有加static要实例化一个对象之后 （对象.方法）调用
        ClassDefine cd=new ClassDefine();
        System.out.println(cd.fac(5));
        //加了static之后
        /*System.out.println(fac(n:5));
        System.out.println(ClassDefine.fac(n:5));*/
    }
    /**
     * 方法定义：
     * [public /protected/private] [static] [final] 类型 方法名（形参）{
     *     方法体
     *     return 表达式
     *
     *    1.方法不能嵌套定义
     *    2若局部变量和成员变量同名，则局部变量屏蔽成员变量
     *    此时若要访问成员变量，用this.成员变量
     * }
     */
    //计算阶乘
    public int fac(int n){
        int s=1;//s为局部变量
        for(int i=1;i<=n;i++){
            s=s*i;
        }
        return s;
    }

}

class StaticDemo{
    int a;
    static int b;
}
